package matheus.tp01cg.objetosdedesenho;

import android.graphics.Bitmap;

public final class RetaDDA extends Reta {
	public RetaDDA(Coords pontoInicial, Coords pontoFinal, int cor) {
		super(pontoInicial, pontoFinal, cor);
	}

	/**
	 * Implementacao do algoritmo DDA para desenho de reta
	 */
	@Override
	public void desenha(Bitmap bitmap) {
		if (!nula) { // a reta pode ter sido anulado pelo algoritmo de recorte
			int x1 = getPontoInicial().x;
			int y1 = getPontoInicial().y;
			int x2 = getPontoFinal().x;
			int y2 = getPontoFinal().y;
			int dx, dy, passos, k;
			double xIncr, yIncr, x, y;
			dx = x2 - x1;
			dy = y2 - y1;
			if (Math.abs(dx) > Math.abs(dy)) {
				passos = Math.abs(dx);
			} else {
				passos = Math.abs(dy);
			}
			xIncr = (double) dx / (double) passos;
			yIncr = (double) dy / (double) passos;
			x = x1;
			y = y1;
			synchronized (bitmap) {
				try {
					bitmapSetPonto(bitmap, (int) Math.round(x),
							(int) Math.round(y), corContorno, espessuraBorda);

				} catch (Exception e) {
					// Log.d(null, "Excecao lancada em " + getClass().toString()
					// + ".desenha() por bitmap.setPixel()", e);
				}
				for (k = 1; k < passos; k++) {
					x += xIncr;
					y += yIncr;
					try {

						bitmapSetPonto(bitmap, (int) Math.round(x),
								(int) Math.round(y), corContorno,
								espessuraBorda);
					} catch (Exception e) {
						// Log.d(null, "Excecao lancada em " +
						// getClass().toString()
						// + ".desenha() por bitmap.setPixel()", e);
					}
				}
			}
		}
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		return (Object) (new RetaDDA((Coords) getPontoInicial().clone(),
				(Coords) getPontoFinal().clone(), getCorContorno()));
	}
}
